package org.edu.common.base;

import com.fasterxml.jackson.annotation.JsonValue;

import java.math.BigDecimal;

/**
 * baseEnum 万能枚举转换器中方便泛型的使用
 * 所有枚举实现这个接口，web层和数据层会自动转换
 */
public interface BaseEnum<T> {
    /**
     * 真正与数据库进行映射的值
     */
    @JsonValue
    T getValue();

    /**
     * 显示的名称
     */
    String getDisplayName();

    /**
     * 按枚举的value获取枚举实例
     *
     */
    static <E extends BaseEnum> E fromValue(Class<E> enumType, Object value) {
        if (value == null) {
            return null;
        }
        for (E e : enumType.getEnumConstants()) {
            if ((value instanceof String && value.equals(e.getValue())) ||
                    (value instanceof Integer && value == e.getValue()) ||
                    (value instanceof BigDecimal && Integer.valueOf(value.toString()) == e.getValue())) {
                return e;
            }
        }
        return null;
    }

    /**
     * 按枚举的value获取枚举显示名称
     *
     */
    static <E extends BaseEnum> String getDisplayNameByValue(Class<E> enumType, Object value) {
        E e = fromValue(enumType, value);
        if (e == null) {
            return null;
        } else {
            return e.getDisplayName();
        }
    }

    /**
     * 获取显示名称
     *
     */
    static <E extends BaseEnum> String getDisplayName(E e) {
        if (e == null) {
            return null;
        } else {
            return e.getDisplayName();
        }
    }

    /**
     * 批量-按枚举的value获取枚举显示名称
     *
     */
    static <E extends BaseEnum> String getDisplayNameByValues(Class<E> enumType, String value) {
        String[] values = value.split(",");
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < values.length; i++) {
            for (E e : enumType.getEnumConstants()) {
                if (values[i].equals(e.getValue().toString())) {
                    if (result.toString().equals("")) {
                        result.append(e.getDisplayName());
                    } else {
                        result.append(",").append(e.getDisplayName());
                    }
                }
            }
        }
        return result.toString();
    }
}
